package com.yc.fav.util;

import com.yc.fav.entity.FavTag;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class Utils {

    public static void main(String[] args) {
        Map<String,String[]> map = new HashMap<>();
        map.put("id", new String[]{"1"});
        map.put("tname", new String[]{"门户","体育"});
        map.put("tcount", new String[]{"5","10"});
        FavTag favTag = Utils.asBean(map, FavTag.class);
        System.out.println(favTag);
    }

    /**
     * 将 Map 集合中的键值对, 设值到对象中
     * J2EE Bean 规范
     * 1. 必须定义无参数构造函数
     * 2. 所有属性必须提供  get,set
     * 3. ...
     *
     * @param map
     * @param tClass
     * @param <T>
     * @return
     */
    public static <T> T asBean(Map<String, String[]> map, Class<T> tClass) {
        T t = null;
        try {
            t = tClass.newInstance();  // => new T();
            Field[] allFields = tClass.getDeclaredFields();
            for (Field field : allFields) {
                String name = field.getName(); // ==> 请求参数名
                String[] values = map.get(name);
                // 假定属性类型是单值类型, 不是数组或集合类型
                if (values != null && values.length > 0) {
                    String svalue= values[0];
                    field.setAccessible(true);
                    // 获取该属性类型: String, int, char ...
                    Object ovalue = null;
                    Class<?> type = field.getType();
                    if(type.isAssignableFrom(String.class)){
                        ovalue = svalue;
                    } else if(type.isAssignableFrom(Integer.class) || type.isAssignableFrom(int.class)){
                        ovalue = Integer.parseInt(svalue);
                    } else if(type.isAssignableFrom(Float.class) || type.isAssignableFrom(float.class)){
                        ovalue = Integer.parseInt(svalue);
                    } else {
                        // 其它类型, 请自行扩展
                    }
                    field.set(t, ovalue);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return t;
    }
}
